home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / term-source.lha / termInfoWindow.c < prev    next >
C/C++ Source or Header  |  1995-09-26  |  8KB  |  407 lines

  1. /*
  2. **    termInfoWindow.c
  3. **
  4. **    Status information window support routines
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_UPDATE=1,GAD_SESSION,GAD_BYTES_IN_OUT,GAD_CONNECT_STRING,GAD_BBS_INFO,
  13.         GAD_SCREEN_SIZE,GAD_PORT_NAME,GAD_BUFFER_SIZE,GAD_MEMORY,
  14.     };
  15.  
  16. STATIC struct Process        *InfoProcess;
  17. STATIC struct LayoutHandle    *InfoHandle;
  18.  
  19.     /* LocalRefreshInfoWindow():
  20.      *
  21.      *    Refresh, i.e. redraw, the contents of the info window.
  22.      */
  23.  
  24. STATIC VOID
  25. LocalRefreshInfoWindow(VOID)
  26. {
  27.     if(InfoWindow)
  28.     {
  29.         UBYTE DummyBuffer[256];
  30.  
  31.         SPrintf(DummyBuffer,ConvNumber,BytesIn);
  32.  
  33.         LT_SetAttributes(InfoHandle,GAD_BYTES_IN_OUT,
  34.             LABX_Index,    0,
  35.             LABX_Text,    DummyBuffer,
  36.         TAG_DONE);
  37.  
  38.         SPrintf(DummyBuffer,ConvNumber,BytesOut);
  39.  
  40.         LT_SetAttributes(InfoHandle,GAD_BYTES_IN_OUT,
  41.             LABX_Index,    1,
  42.             LABX_Text,    DummyBuffer,
  43.         TAG_DONE);
  44.  
  45.         Forbid();
  46.  
  47.         if(XEmulatorBase && XEM_IO)
  48.         {
  49.             if(XEmulatorBase -> lib_Version >= 4)
  50.             {
  51.                 ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  52.  
  53.                 SPrintf(DummyBuffer,"%ld × %ld",XEMI_EXTRACT_COLUMNS(Result),XEMI_EXTRACT_LINES(Result));
  54.             }
  55.             else
  56.                 strcpy(DummyBuffer,"???");
  57.         }
  58.         else
  59.             SPrintf(DummyBuffer,"%ld × %ld",LastColumn + 1,LastLine + 1);
  60.  
  61.         Permit();
  62.  
  63.         LT_SetAttributes(InfoHandle,GAD_SCREEN_SIZE,
  64.             GTTX_Text,    DummyBuffer,
  65.         TAG_DONE);
  66.  
  67.         SPrintf(DummyBuffer,ConvNumber,BufferSpace);
  68.  
  69.         LT_SetAttributes(InfoHandle,GAD_BUFFER_SIZE,
  70.             GTTX_Text,    DummyBuffer,
  71.         TAG_DONE);
  72.  
  73.         SPrintf(DummyBuffer,ConvNumber,AvailMem(MEMF_ANY));
  74.  
  75.         LT_SetAttributes(InfoHandle,GAD_MEMORY,
  76.             GTTX_Text,    DummyBuffer,
  77.         TAG_DONE);
  78.  
  79.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  80.             LABX_Index,    0,
  81.             LABX_Text,    CurrentBBSName[0] ? CurrentBBSName : (STRPTR)"-",
  82.         TAG_DONE);
  83.  
  84.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  85.             LABX_Index,    1,
  86.             LABX_Text,    CurrentBBSNumber[0] ? CurrentBBSNumber : (STRPTR)"-",
  87.         TAG_DONE);
  88.  
  89.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  90.             LABX_Index,    2,
  91.             LABX_Text,    CurrentBBSComment[0] ? CurrentBBSComment : (STRPTR)"-",
  92.         TAG_DONE);
  93.  
  94.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  95.             LABX_Index,    3,
  96.             LABX_Text,    UserName[0] ? UserName : (STRPTR)"-",
  97.         TAG_DONE);
  98.     }
  99. }
  100.  
  101.     /* LocalCloseInfoWindow():
  102.      *
  103.      *    Close the info window.
  104.      */
  105.  
  106. STATIC VOID
  107. LocalCloseInfoWindow(VOID)
  108. {
  109.     Forbid();
  110.  
  111.     CheckItem(MEN_STATUS_WINDOW,FALSE);
  112.  
  113.     Permit();
  114.  
  115.     if(InfoHandle)
  116.     {
  117.         LT_DeleteHandle(InfoHandle);
  118.  
  119.         InfoHandle = NULL;
  120.     }
  121.  
  122.     InfoWindow = NULL;
  123. }
  124.  
  125.     /* LocalOpenInfoWindow():
  126.      *
  127.      *    Open the info window.
  128.      */
  129.  
  130. STATIC BOOLEAN
  131. LocalOpenInfoWindow(VOID)
  132. {
  133.     if(InfoHandle = LT_CreateHandleTags(Window -> WScreen,
  134.         LH_LocaleHook,    &LocaleHook,
  135.     TAG_DONE))
  136.     {
  137.         LT_New(InfoHandle,
  138.             LA_Type,    VERTICAL_KIND,
  139.         TAG_DONE);
  140.         {
  141.             LT_New(InfoHandle,
  142.                 LA_Type,    VERTICAL_KIND,
  143.             TAG_DONE);
  144.             {
  145.                 UBYTE DummyBuffer[256];
  146.  
  147.                 if(!FormatStamp(&SessionStart,NULL,NULL,DummyBuffer,FALSE))
  148.                     strcpy(DummyBuffer,"-");
  149.  
  150.                 LT_New(InfoHandle,
  151.                     LA_Type,        TEXT_KIND,
  152.                     LA_LabelID,        MSG_INFOWINDOW_SESSION_START_GAD,
  153.                     LA_ID,            GAD_SESSION,
  154.                     LA_Chars,        40,
  155.                     GTTX_Text,        DummyBuffer,
  156.                     GTTX_Border,        TRUE,
  157.                     GTTX_CopyText,        TRUE,
  158.                 TAG_DONE);
  159.  
  160.                 LT_New(InfoHandle,
  161.                     LA_Type,        XBAR_KIND,
  162.                 TAG_DONE);
  163.  
  164.                 LT_New(InfoHandle,
  165.                     LA_Type,        BOX_KIND,
  166.                     LA_ID,            GAD_BYTES_IN_OUT,
  167.                     LABX_FirstLabel,    MSG_INFOWINDOW_BYTES_RECEIVED_GAD,
  168.                     LABX_LastLabel,        MSG_INFOWINDOW_BYTES_SENT_GAD,
  169.                     LABX_ReserveSpace,    TRUE,
  170.                     LABX_DrawBox,        TRUE,
  171.                     LA_Chars,        40,
  172.                 TAG_DONE);
  173.  
  174.                 LT_New(InfoHandle,
  175.                     LA_Type,        XBAR_KIND,
  176.                 TAG_DONE);
  177.  
  178.                 LT_New(InfoHandle,
  179.                     LA_Type,        TEXT_KIND,
  180.                     LA_LabelID,        MSG_INFOWINDOW_CONNECTION_MESSAGE_GAD,
  181.                     LA_ID,            GAD_CONNECT_STRING,
  182.                     GTTX_Text,        BaudBuffer[0] ? BaudBuffer : (STRPTR)"-",
  183.                     GTTX_Border,        TRUE,
  184.                     GTTX_CopyText,        TRUE,
  185.                 TAG_DONE);
  186.  
  187.                 LT_New(InfoHandle,
  188.                     LA_Type,        BOX_KIND,
  189.                     LA_ID,            GAD_BBS_INFO,
  190.                     LABX_FirstLabel,    MSG_INFOWINDOW_BBS_NAME_GAD,
  191.                     LABX_LastLabel,        MSG_INFOWINDOW_BBS_USER_NAME_GAD,
  192.                     LABX_ReserveSpace,    TRUE,
  193.                     LABX_DrawBox,        TRUE,
  194.                     LA_Chars,        40,
  195.                 TAG_DONE);
  196.  
  197.                 LT_New(InfoHandle,
  198.                     LA_Type,        XBAR_KIND,
  199.                 TAG_DONE);
  200.  
  201.                 LT_New(InfoHandle,
  202.                     LA_Type,        TEXT_KIND,
  203.                     LA_LabelID,        MSG_INFOWINDOW_SCREEN_SIZE_GAD,
  204.                     LA_ID,            GAD_SCREEN_SIZE,
  205.                     GTTX_Border,        TRUE,
  206.                     GTTX_CopyText,        TRUE,
  207.                 TAG_DONE);
  208.  
  209.                 LT_New(InfoHandle,
  210.                     LA_Type,        TEXT_KIND,
  211.                     LA_LabelID,        MSG_INFOWINDOW_AREXX_PORT_NAME_GAD,
  212.                     LA_ID,            GAD_PORT_NAME,
  213.                     GTTX_Text,        RexxPortName,
  214.                     GTTX_Border,        TRUE,
  215.                     GTTX_CopyText,        TRUE,
  216.                 TAG_DONE);
  217.  
  218.                 LT_New(InfoHandle,
  219.                     LA_Type,        TEXT_KIND,
  220.                     LA_LabelID,        MSG_INFOWINDOW_BUFFER_SIZE_GAD,
  221.                     LA_ID,            GAD_BUFFER_SIZE,
  222.                     GTTX_Border,        TRUE,
  223.                     GTTX_CopyText,        TRUE,
  224.                 TAG_DONE);
  225.  
  226.                 LT_New(InfoHandle,
  227.                     LA_Type,        TEXT_KIND,
  228.                     LA_LabelID,        MSG_INFOWINDOW_FREE_MEMORY_GAD,
  229.                     LA_ID,            GAD_MEMORY,
  230.                     GTTX_Border,        TRUE,
  231.                     GTTX_CopyText,        TRUE,
  232.                 TAG_DONE);
  233.  
  234.                 LT_EndGroup(InfoHandle);
  235.             }
  236.  
  237.             LT_New(InfoHandle,
  238.                 LA_Type,VERTICAL_KIND,
  239.             TAG_DONE);
  240.             {
  241.                 LT_New(InfoHandle,
  242.                     LA_Type,    XBAR_KIND,
  243.                     LAXB_FullSize,    TRUE,
  244.                 TAG_DONE);
  245.  
  246.                 LT_EndGroup(InfoHandle);
  247.             }
  248.  
  249.             LT_New(InfoHandle,
  250.                 LA_Type,    HORIZONTAL_KIND,
  251.             TAG_DONE);
  252.             {
  253.                 LT_New(InfoHandle,
  254.                     LA_Type,    BUTTON_KIND,
  255.                     LA_LabelID,    MSG_V36_1414,
  256.                     LA_ID,        GAD_UPDATE,
  257.                     LA_ReturnKey,    TRUE,
  258.                     LABT_ExtraFat,    TRUE,
  259.                 TAG_DONE);
  260.  
  261.                 LT_EndGroup(InfoHandle);
  262.             }
  263.  
  264.             LT_EndGroup(InfoHandle);
  265.         }
  266.  
  267.         if(InfoWindow = LT_Build(InfoHandle,
  268.             LAWN_TitleID,        MSG_INFOWINDOW_STATUS_INFORMATION_TXT,
  269.             LAWN_IDCMP,        IDCMP_CLOSEWINDOW,
  270.             LAWN_AlignWindow,    ALIGNF_RIGHT,
  271.             LAWN_HelpHook,        &GuideHook,
  272.             WA_DepthGadget,        TRUE,
  273.             WA_CloseGadget,        TRUE,
  274.             WA_DragBar,        TRUE,
  275.             WA_RMBTrap,        TRUE,
  276.             WA_SimpleRefresh,    TRUE,
  277.         TAG_DONE))
  278.         {
  279.             LocalRefreshInfoWindow();
  280.  
  281.             return(TRUE);
  282.         }
  283.         else
  284.         {
  285.             LT_DeleteHandle(InfoHandle);
  286.  
  287.             InfoHandle = NULL;
  288.         }
  289.     }
  290.  
  291.     return(FALSE);
  292. }
  293.  
  294. STATIC VOID __saveds
  295. StatusProcessEntry(VOID)
  296. {
  297.     struct Process *Parent = ThisProcess;
  298.  
  299.     if(LocalOpenInfoWindow())
  300.     {
  301.         struct IntuiMessage    *Message;
  302.         ULONG             MsgClass;
  303.         struct Gadget        *MsgGadget;
  304.         BOOLEAN             Done = FALSE;
  305.  
  306.         InfoProcess = (struct Process *)FindTask(NULL);
  307.  
  308.         Signal(Parent,SIG_HANDSHAKE);
  309.  
  310.         do
  311.         {
  312.             if(Wait(PORTMASK(InfoWindow -> UserPort) | SIG_KILL) & SIG_KILL)
  313.                 break;
  314.             else
  315.             {
  316.                 while(Message = LT_GetIMsg(InfoHandle))
  317.                 {
  318.                     MsgClass    = Message -> Class;
  319.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  320.  
  321.                     LT_ReplyIMsg(Message);
  322.  
  323.                     switch(MsgClass)
  324.                     {
  325.                         case IDCMP_CLOSEWINDOW:
  326.  
  327.                             if(!Done)
  328.                             {
  329.                                 Forbid();
  330.  
  331.                                 if(!(SetSignal(0,SIG_KILL) & SIG_KILL))
  332.                                     Parent = NULL;
  333.  
  334.                                 Done = TRUE;
  335.                             }
  336.  
  337.                             break;
  338.  
  339.                         case IDCMP_GADGETUP:
  340.  
  341.                             if(MsgGadget -> GadgetID == GAD_UPDATE)
  342.                                 LocalRefreshInfoWindow();
  343.  
  344.                             break;
  345.                     }
  346.                 }
  347.             }
  348.         }
  349.         while(!Done);
  350.  
  351.         LocalCloseInfoWindow();
  352.     }
  353.  
  354.     Forbid();
  355.  
  356.     InfoProcess = NULL;
  357.  
  358.     if(Parent)
  359.         Signal(Parent,SIG_HANDSHAKE);
  360. }
  361.  
  362. VOID
  363. CloseInfoWindow()
  364. {
  365.     Forbid();
  366.  
  367.     if(InfoProcess)
  368.     {
  369.         ClrSignal(SIG_HANDSHAKE);
  370.  
  371.         Signal(InfoProcess,SIG_KILL);
  372.  
  373.         Wait(SIG_HANDSHAKE);
  374.     }
  375.  
  376.     Permit();
  377. }
  378.  
  379. VOID
  380. OpenInfoWindow()
  381. {
  382.     Forbid();
  383.  
  384.     if(!InfoProcess)
  385.     {
  386.         if(CreateNewProcTags(
  387.             NP_Entry,    StatusProcessEntry,
  388.             NP_Name,    "term Status Window Process",
  389.             NP_Priority,    SysBase -> ThisTask -> tc_Node . ln_Pri,
  390.             NP_StackSize,    4000,
  391.             NP_WindowPtr,    -1,
  392.         TAG_END))
  393.         {
  394.             ClrSignal(SIG_HANDSHAKE);
  395.  
  396.             Wait(SIG_HANDSHAKE);
  397.         }
  398.     }
  399.  
  400.     if(InfoProcess)
  401.         CheckItem(MEN_STATUS_WINDOW,TRUE);
  402.     else
  403.         CheckItem(MEN_STATUS_WINDOW,FALSE);
  404.  
  405.     Permit();
  406. }
  407.